#!/usr/bin/env python

from __future__ import print_function
import sys
import io
import re
import argparse

def size_to_hex(s):
    s = s.upper()
    m = re.match('(\d+)([KMG]B?)', s)
    if m:
        n = int(m.group(1))
        u = m.group(2)
        if u.startswith('M'):
            return hex(n<<20)
        elif u.startswith('K'):
            return hex(n<<10)
        elif u.startswith('G'):
            return hex(n<<30)
        else:
            return hex(0)

def print_definition(k, v):
    print('#define {0} {1}'.format(k, v))

def print_header(args, data):
    if args.full:
        print_definition(args.full, data['fullsize'])
    if args.offset:
        for i in args.offset:
            print_definition(i[1], data[i[0]]['offset'])
    if args.size:
        for i in args.size:
            print_definition(i[1], data[i[0]]['size'])

def parse_args(argv):
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--offset', nargs=2, action='append')
    parser.add_argument('-s', '--size', nargs=2, action='append')
    parser.add_argument('-f', '--full')
    return parser.parse_args()

def main(argv):
    args = parse_args(argv)
    data = {}
    line = sys.stdin.readline()
    m = re.search(r'flash\s*=\s*(.*)', line)
    if m:
        h = size_to_hex(m.group(1).strip())
        data['fullsize'] = h
    for line in sys.stdin:
        m = re.search(r'\d+\s*=\s*(.*)', line)
        if m:
            fields = re.split(r'[\s,]+', m.group(1))
            data[fields[0]] = {'offset': fields[1], 'size': fields[2]}
    print_header(args, data)

if __name__ == '__main__':
    main(sys.argv)
